package com.cs.beneficios.business.entity;

//import com.cs.beneficios.business.model.RepAtributoVO;
//import com.cs.beneficios.business.model.RepBeneficioOtorgadoVO;

import com.cs.beneficios.business.model.ReportComunaVO;
//import com.cs.beneficios.business.model.ReporteTotalBeneficiosOtorVO;
import com.cs.beneficios.business.model.ReporteTotalComunaVO;
//import com.cs.beneficios.business.model.VflexVO;
import com.cs.beneficios.common.ConnectionFactory;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;

import java.util.ArrayList;
import java.util.Collection;
//import java.util.LinkedList;
//import java.util.List;

public class ReporteTotalComunaDAO
{
  /**
   * Conexion a la base de datos.
   */
  private Connection conn = null;
  private ConnectionFactory cf;
  
  /**
   * Constructor que inicializa la conexion con la base de datos.
   * @param conn Conexion con la base de datos.
   */
   
  public ReporteTotalComunaDAO(ConnectionFactory cf)
  {
    this.cf = cf;
    try{
      this.conn = this.cf.getConnection();
    }catch(SQLException e){}
  }
  
  public Collection GetBenBerComuna(ReporteTotalComunaVO criterea)throws SQLException
  {
     String query = "SELECT COUNT(DISTINCT beneotor.BEN_CODIGO) contbeneficiario, COUNT(beneotor.CODIGO) contbeneficio, "+
                    "SUM(beneotor.VALOR_BENEFICIO) valor, comuna.NOMBRE nomcomuna, prog.NOMBRE nompro, subpro.NOMBRE nomsubpro "+
                    "FROM TCS_BEN_PROGRAMA prog, TCS_BEN_SUBPROGRAMA subpro, paoyer.TCS_VALOR_FLEXIBLE comuna, "+
                    "TCS_BEN_BENEFICIO_OTORGADO beneotor,TCS_BEN_BENEFICIARIO beneficiario "+
                    "WHERE beneotor.SBPR_CODIGO =  subpro.CODIGO "+
                    "AND subpro.PRG_CODIGO = prog.CODIGO "+
                    "AND beneficiario.CODIGO = beneotor.BEN_CODIGO "+
                    "AND beneficiario.VFL_CODIGO_COMUNA = comuna.CODIGO and prog.vigencia='A' and subpro.vigencia='A' ";
                    
                    
                    
    if((Object)criterea.getCodeComuna() != null)
    {
      query += " and comuna.CODIGO = "+criterea.getCodeComuna();
    }
    if((Object)criterea.getCodeSubprograma() != null)
    {
      query += " and subpro.CODIGO = "+criterea.getCodeSubprograma();
    }
    if((Object)criterea.getCodePrograma() != null)
    {
      query += " and prog.CODIGO = "+criterea.getCodePrograma();
    }
   
    if((Object)criterea.getDesde() != null && (Object)criterea.getHasta() != null)
    {
      query += "and beneotor.FECHA_BENEFICIO between TO_DATE('"+criterea.getDesde()+"','dd/mm/rrrr') and TO_DATE('"+criterea.getHasta()+"','dd/mm/rrrr')";
    }
    if((Object)criterea.getDesde() != null && (Object)criterea.getHasta() == null)
    {
      query += "and beneotor.FECHA_BENEFICIO >= TO_DATE('"+criterea.getDesde()+"','dd/mm/rrrr')";
    }
    if((Object)criterea.getDesde() == null && (Object)criterea.getHasta() != null)
    {
      query += "and beneotor.FECHA_BENEFICIO <= TO_DATE('"+criterea.getHasta()+"','dd/mm/rrrr')";
    }
    query += " GROUP BY comuna.NOMBRE,prog.NOMBRE,subpro.NOMBRE ";             
    query += " ORDER BY comuna.NOMBRE,prog.NOMBRE,subpro.NOMBRE";
    
    ResultSet rst = null;
    //System.out.println(query);
    ArrayList lbeneotor = new ArrayList();
    rst = cf.getRecordsRset(query,null,conn);
    ReportComunaVO objbeneficios = null;
    long totalvalor =0;
    long totalben = 0;
    long totalber = 0;
    while ( rst.next() ) 
		{
        objbeneficios = new ReportComunaVO();
        objbeneficios.setNombrePrograma(rst.getString("nompro"));
        objbeneficios.setNombreSubprograma(rst.getString("nomsubpro"));
        objbeneficios.setNombreComuna(rst.getString("nomcomuna"));
        objbeneficios.setContben(rst.getInt("contbeneficio"));
        objbeneficios.setContber(rst.getInt("contbeneficiario"));
        objbeneficios.setValor(rst.getLong("valor"));
        totalvalor+=rst.getLong("valor");
        totalben+=rst.getLong("contbeneficio");
        totalber+=rst.getLong("contbeneficiario");
        lbeneotor.add(objbeneficios);
        
        objbeneficios=null;
    }
    
    if(lbeneotor.size()>0)
    {
      objbeneficios = new ReportComunaVO();
      objbeneficios.setNombreComuna("VALOR TOTAL");
      objbeneficios.setContben(totalben);
      objbeneficios.setContber(totalber);
      objbeneficios.setValor(totalvalor);
    
      lbeneotor.add(objbeneficios);
      
      objbeneficios=null;
    }
    rst.close();
    return lbeneotor;
  }
  
  /************************************************
   * Metodo para provisional para recuprar los filtros utilizados en el reporte
   * *********************************************/
   public ReporteTotalComunaVO getFilters(ReporteTotalComunaVO objRtcVO)throws SQLException
   {
     String strQuery = null;
     ResultSet rst = null;
     
     if(objRtcVO.getCodeComuna() != null)
     {
       strQuery = "SELECT NOMBRE" +
                  " FROM PAOYER.TCS_VALOR_FLEXIBLE" +
                  " WHERE CODIGO = " + objRtcVO.getCodeComuna();
       rst = cf.getRecordsRset(strQuery,null,conn);
       
       rst.next();
       objRtcVO.setNombreComuna(rst.getString("NOMBRE"));
     }
     if(objRtcVO.getCodePrograma() != null)
     {
       strQuery = "SELECT NOMBRE" +
                  " FROM TCS_BEN_PROGRAMA" +
                  " WHERE CODIGO = " + objRtcVO.getCodePrograma();
       rst = cf.getRecordsRset(strQuery,null,conn);
       
       rst.next();
       objRtcVO.setNombrePrograma(rst.getString("NOMBRE"));
     }
     if(objRtcVO.getCodeSubprograma() != null)
     {
       strQuery = "SELECT NOMBRE" +
                  " FROM TCS_BEN_SUBPROGRAMA" +
                  " WHERE CODIGO = " + objRtcVO.getCodeSubprograma();
       rst = cf.getRecordsRset(strQuery,null,conn);
       
       rst.next();
       objRtcVO.setNombreSubprograma(rst.getString("NOMBRE"));
     }
     
     if(rst != null)
       rst.close();
       
     return objRtcVO;
   }
  
  public Connection getConn()
  {
    return conn;
  }
}